package com.leetcode.demo;

/**
 * @author 王溪源
 * @ClassName: Question69
 * @Description: 实现int sqrt(int x)函数。
 *
 * 计算并返x的平方根，其中x 是非负整数。
 *
 * 由于返回类型是整数，结果只保留整数的部分，小数部分将被舍去。
 *
 * 输入: 4
 * 输出: 2
 *
 * 输入: 8
 * 输出: 2
 * 说明: 8 的平方根是 2.82842...,
 *      由于返回类型是整数，小数部分将被舍去。
 * @Date 2021/8/28 1:14
 * @see Question35#searchInsert2(int[], int)
 * TODO 牛顿迭代法
 **/
public class Question69 {
    public static int mySqrt(int x) {
        return (int)Math.sqrt (x);
    }

    public static int mySqrt2(int x) {
        // 特殊值判断
        if (x == 0) {
            return 0;
        }
        if (x == 1) {
            return 1;
        }
        int start = 0;
        int end = x;
        while(start < end){
            // 这里计算中间值的时候+1，是为了防止计算出的mid始终与start相等，造成死循环
            int mid = (end - start + 1) / 2 + start;
            // 防止溢出
            if(mid <= x / mid){
                start = mid;
            }else{
                end = mid - 1;
            }
        }
        return start;
    }

    public static void main(String[] args) {
        System.out.println (mySqrt2 (8));
        System.out.println (mySqrt2(2147395599));
        System.out.println (46340 * 46340);
    }
}
